﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;                    // テキストファイル読み込み用
using System.DirectoryServices;     // フルネーム取得用
using System.Windows.Forms;
using MakeTest;

/// <summary>
/// データテーブルの構造体
/// </summary>
struct QTable
{
    public ushort QuizNo;                               // 問題番号
    public sbyte Answer;                                // 正解番号（1～4）
    public string Quiz;                                 // クイズ文
    public string Text1;                                // 解答1
    public string Text2;                                // 解答2
    public string Text3;                                // 解答3
    public string Text4;                                // 解答4
    public string UniqID;                               // ユニークID
    public string DUser;                                // ドメインユーザ名
}

namespace MakeTest
{
    public partial class Form1 : Form
    {
        private const Int32 DEF_MAX_QUIZ_NO = 99;		// 問題番号の最大値（現在は99までしかサポートしない）

        public string dName;
        public string UniqID;
        QTable _qTable = new QTable();
        DataTable dt = new DataTable("DataTableQ");
        string tmpAllText = "";

        public Form1()
        {
            InitializeComponent();

            InitializeTable();

            InitializeData(true);
        }

        // テーブルの初期化を読み込む
        public void InitializeTable()
        {
            dt.Columns.Add("No", Type.GetType("System.UInt32"));
            dt.Columns.Add("AnswerNo", Type.GetType("System.SByte"));
            dt.Columns.Add("Quiz", Type.GetType("System.String"));
            dt.Columns.Add("Txt1", Type.GetType("System.String"));
            dt.Columns.Add("Txt2", Type.GetType("System.String"));
            dt.Columns.Add("Txt3", Type.GetType("System.String"));
            dt.Columns.Add("Txt4", Type.GetType("System.String"));
            dt.Columns.Add("UniqID", Type.GetType("System.String"));
            dt.Columns.Add("DUser", Type.GetType("System.String"));
        }
        // テーブルのクリア
        public void ClearTable()
        {
            dt.Clear();
        }

        // ファイルを読み込む
        public void InitializeData(bool bInit)  // True：問題番号の表示も初期化　False：問題番号の表示はそのまま
        {
            tmpAllText = "";

            // テーブルのクリア
            ClearTable();

            // 現在の日付と時刻を取得する
            DateTime dtNow;
            dtNow = DateTime.Now;
            // 時刻取得（ユニークIDとして使用）
            UniqID = dtNow.ToString().Replace("/", "");
            UniqID = UniqID.Replace(":", "");
            UniqID = UniqID.Replace(" ", "-");

            /************************/
            /* ドメインユーザ名取得 */
            /************************/
            string user = Environment.UserName;
            string domain = Environment.UserDomainName;

            string path = "WinNT://" + domain + "/" + user;
            using (DirectoryEntry dirEnt = new DirectoryEntry(path))
            {
                // フルネーム取得
                dName = dirEnt.Properties["FullName"].Value.ToString();
            }
            /***/

            /**************************/
            /* 空いている問題番号取得 */
            // 未実装（現在は問題数を数えているだけ）
            /**************************/
            StreamReader reader;
            ushort unLine = 0;          // 問題番号として使用
            string strText = "";
            string[] stArrayData;

            // ファイルリード
            using (reader = new StreamReader(@"C:test.txt", Encoding.GetEncoding("SHIFT_JIS")))
            {
                // 読み込みできる文字がなくなるまで繰り返す
                while (reader.Peek() >= 0)
                {
                    // ファイルを 1 行ずつ読み込む
                    strText = reader.ReadLine();
                    if (!strText.StartsWith("//") && strText != "")         // 先頭がコメント or 空白行だった場合は処理しない
                    {
                        // カンマ区切りで分割して配列に格納する
                        stArrayData = strText.Split(',');

                        dt.Rows.Add(dt.NewRow());
                        dt.Rows[unLine]["No"] = ushort.Parse(stArrayData[0].Trim());
                        dt.Rows[unLine]["AnswerNo"] = sbyte.Parse(stArrayData[1].Trim());
                        dt.Rows[unLine]["Quiz"] = stArrayData[2].Trim();
                        dt.Rows[unLine]["Txt1"] = stArrayData[3].Trim();
                        dt.Rows[unLine]["Txt2"] = stArrayData[4].Trim();
                        dt.Rows[unLine]["Txt3"] = stArrayData[5].Trim();
                        dt.Rows[unLine]["Txt4"] = stArrayData[6].Trim();
                        dt.Rows[unLine]["UniqID"] = stArrayData[7].Trim();
                        dt.Rows[unLine]["DUser"] = stArrayData[8].Trim();
                        unLine++;
                    }
                    else
                    {
                        if (tmpAllText == "")
                        {
                            tmpAllText = strText;
                        }
                        else
                        {
                            tmpAllText = tmpAllText + "\r\n" + strText;
                        }
                    }
                }
                reader.Dispose();
                reader.Close();
            }
            if (unLine >= DEF_MAX_QUIZ_NO)
            {
                unLine = DEF_MAX_QUIZ_NO;
            }

            if (bInit)
            {
                _qTable.QuizNo = unLine;
                nud_Question.Value = _qTable.QuizNo;
            }
        }

        // 問題をコミットする
        private void btn_Commit_Click(object sender, EventArgs e)
        {
            Boolean bSts = true;
            StreamWriter writer;

            // 問題文が空白 or 解答が全て空白の場合キレる
            if ((GetQuiz().Trim() == "") || (GetText1().Trim() == "" && GetText2().Trim() == "" && GetText3().Trim() == "" && GetText4().Trim() == ""))
            {
                MessageBox.Show("問題、解答が入力されてないぞ！クソがぁ！",
                "Fuck！",
                MessageBoxButtons.OK,
                MessageBoxIcon.Error);
            }
            else
            {
                try
                {
                    bool bNew = true;       // True：新規　False：上書き
                    int tmpNum = 0;
                    int tmpQno = 0;

                    tmpNum = dt.Rows.Count; // 問題数を保持
                    tmpQno = GetQuizNo();

                    // 他の人が更新していないかチェック
                    InitializeData(false);
                    if (dt.Rows.Count > tmpNum)
                    {
                        _qTable.QuizNo = (ushort)dt.Rows.Count;
                        _qTable.QuizNo++;
                    }

                    for (int iLoop = 0; iLoop < tmpNum; iLoop++)
                    {
                        /**********************************************/
                        /* 問題番号と作成者が一致していれば上書きする */
                        /**********************************************/
                        if (Convert.ToUInt32(dt.Rows[iLoop]["No"]) == tmpQno)       // 問題番号チェック
                        {
                            if ((string)dt.Rows[iLoop]["DUser"] == dName)			// 作成者チェック
                            {
                                dt.Rows[iLoop]["No"] = tmpQno;
                                dt.Rows[iLoop]["AnswerNo"] = GetAnswer();
                                dt.Rows[iLoop]["Quiz"] = GetQuiz();
                                dt.Rows[iLoop]["Txt1"] = GetText1();
                                dt.Rows[iLoop]["Txt2"] = GetText2();
                                dt.Rows[iLoop]["Txt3"] = GetText3();
                                dt.Rows[iLoop]["Txt4"] = GetText4();
                                dt.Rows[iLoop]["UniqID"] = GetNewUniqID();
                                dt.Rows[iLoop]["DUser"] = GetDUser();
                                bNew = false;
                                break;
                            }
                        }
                    }

                    // ファイルコピー
                    File.Copy(@"C:\test.txt", @"C:\test2.txt", true);
                    File.Delete(@"C:\test.txt");

                    // 新規の問題かどうかチェック
                    if (bNew)   // 新規の問題のファイルの先頭に追加したいので、コメントにくっつける
                    {
                        tmpAllText = tmpAllText + "\r\n" + GetQuizNo() + ", " + GetAnswer() + ", " + GetQuiz() + ", " + GetText1() + ", " + GetText2() + ", " + GetText3() + ", " + GetText4() + ", " + GetNewUniqID() + ", " + GetNewDomeinUser();
                    }

                    // ファイルオープン
                    using (writer = new StreamWriter(@"C:\test.txt", true, Encoding.GetEncoding("SHIFT_JIS")))     // 新規作成
                    {
                        //bSts = TextWrite.Write2(writer, txt, strTextAll);
                        bSts = TextWrite.WriteAll(writer, dt, tmpAllText);

                    }
                    if (bSts == false)
                    {
                        MessageBox.Show("書き込みエラー。テキストは編集中です。",
                        "エラー！",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
                    }
                    else
                    {
                        MessageBox.Show("問題を作成しました。",
                        "書き込み完了",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information);

                        // テキスト再読み込み
                        InitializeData(true);

                        // 表示
                        ClearQTable();
                        _qTable.QuizNo++;   // 問題番号インクリメント
                        nud_Question.Value = _qTable.QuizNo;
                        txtQuiz.Text = GetQuiz();
                        nud_Answer.Value = GetAnswer();
                        textBox1.Text = GetText1();
                        textBox2.Text = GetText2();
                        textBox3.Text = GetText3();
                        textBox4.Text = GetText4();
                        lbl_DUser.Text = "作成者：" + GetDUser();
                    }

                }
                catch (Exception err)
                {
                    MessageBox.Show("ネットワークに接続＆サーバーが起動していないとプレイできません。",
                    "エラー！",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                }
            }
        }

        private void nud_Question_ValueChanged(object sender, EventArgs e)
        {
            _qTable.QuizNo = (ushort)nud_Question.Value;

            ClearQTable();

            for (int iLoop = 0; iLoop < dt.Rows.Count; iLoop++)
            {
                /**********************************************/
                /* 問題番号と作成者が一致していれば上書きする */
                /**********************************************/
                if (Convert.ToUInt32(dt.Rows[iLoop]["No"]) == GetQuizNo())      // 問題番号チェック
                {
                    _qTable.QuizNo = (ushort)Convert.ToUInt32(dt.Rows[iLoop]["No"]);
                    _qTable.Answer = Convert.ToSByte(dt.Rows[iLoop]["AnswerNo"]);
                    _qTable.Quiz = Convert.ToString(dt.Rows[iLoop]["Quiz"]);
                    _qTable.Text1 = Convert.ToString(dt.Rows[iLoop]["Txt1"]);
                    _qTable.Text2 = Convert.ToString(dt.Rows[iLoop]["Txt2"]);
                    _qTable.Text3 = Convert.ToString(dt.Rows[iLoop]["Txt3"]);
                    _qTable.Text4 = Convert.ToString(dt.Rows[iLoop]["Txt4"]);
                    _qTable.UniqID = Convert.ToString(dt.Rows[iLoop]["UniqID"]);
                    _qTable.DUser = Convert.ToString(dt.Rows[iLoop]["DUser"]);
                    break;
                }
            }

            // 表示
            txtQuiz.Text = GetQuiz();
            nud_Answer.Value = GetAnswer();
            textBox1.Text = GetText1();
            textBox2.Text = GetText2();
            textBox3.Text = GetText3();
            textBox4.Text = GetText4();
            lbl_DUser.Text = "作成者：" + GetDUser();

            // 作成者かどうかチェック
            if (GetDUser() == GetNewDomeinUser() || GetDUser() == "" )
            {
                lbl_Answer.Show();
                lbl_Answer2.Show();
                nud_Answer.Show();
                btn_Commit.Show();
            }
            else
            {
                lbl_Answer.Hide();
                lbl_Answer2.Hide();
                nud_Answer.Hide();
                btn_Commit.Hide();
            }
        }

        private void txtQuiz_TextChanged(object sender, EventArgs e)
        {
            _qTable.Quiz = txtQuiz.Text;
            _qTable.Quiz = _qTable.Quiz.Replace("\r", "").Replace("\n", "");        // 改行を削除
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            _qTable.Text1 = textBox1.Text;
            _qTable.Text1 = _qTable.Text1.Replace("\r", "").Replace("\n", "");      // 改行を削除
        }
        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            _qTable.Text2 = textBox2.Text;
            _qTable.Text2 = _qTable.Text2.Replace("\r", "").Replace("\n", "");      // 改行を削除
        }
        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            _qTable.Text3 = textBox3.Text;
            _qTable.Text3 = _qTable.Text3.Replace("\r", "").Replace("\n", "");      // 改行を削除

        }
        private void textBox4_TextChanged(object sender, EventArgs e)
        {
            _qTable.Text4 = textBox4.Text;
            _qTable.Text4 = _qTable.Text4.Replace("\r", "").Replace("\n", "");      // 改行を削除
        }
        private void nud_Answer_ValueChanged(object sender, EventArgs e)
        {
            _qTable.Answer = Convert.ToSByte(nud_Answer.Value);
        }

    // 入力値取得用
        // 問題番号を取得する
        public ushort GetQuizNo()
        {
            return _qTable.QuizNo;
        }

        // 正解を取得する
        public sbyte GetAnswer()
        {
            return _qTable.Answer;
        }

        // 問題文を取得する
        public String GetQuiz()
        {
            return _qTable.Quiz;
        }

        // 解答1を取得する
        public String GetText1()
        {
            return _qTable.Text1;
        }

        // 解答2を取得する
        public String GetText2()
        {
            return _qTable.Text2;
        }

        // 解答3を取得する
        public String GetText3()
        {
            return _qTable.Text3;
        }

        // 解答4を取得する
        public String GetText4()
        {
            return _qTable.Text4;
        }

        // ユニークIDを取得する
        public String GetUniqID()
        {
            return _qTable.UniqID;
        }

        // 作成者名を取得する
        public String GetDUser()
        {
            return _qTable.DUser;
        }
    // クリア
        public void ClearQTable()
        {
            //_qTable.QuizNo = 0;   // クイズ番号はクリアしない
            _qTable.Answer = 1;
            _qTable.Quiz = "";
            _qTable.Text1 = "";
            _qTable.Text2 = "";
            _qTable.Text3 = "";
            _qTable.Text4 = "";
            _qTable.UniqID = "";
            _qTable.DUser = "";
        }

        // ユニークIDを取得する
        public String GetNewUniqID()
        {
            return UniqID;
        }

        // ドメインユーザ名を取得する
        public String GetNewDomeinUser()
        {
            return dName;
        }
    }
}

public static class TextWrite
{
    // テキストに書き込む場合
    public static bool Write2(StreamWriter writer, String txt, String txt2)
    {
        bool bResult = true;
        DateTime dtNow;

        try
        {
            // 現在の日付と時刻を取得する
            dtNow = DateTime.Now;

            //string machine = Environment.MachineName;
            string user = Environment.UserName;
            string domain = Environment.UserDomainName;

            string path = "WinNT://" + domain + "/" + user;
            string dName;
            using (DirectoryEntry dirEnt = new DirectoryEntry(path))
            {
                // フルネーム取得
                dName = dirEnt.Properties["FullName"].Value.ToString();
            }

            // 時刻取得（ユニークIDとして使用）
            string strtmp = dtNow.ToString().Replace("/", "");
            strtmp = strtmp.Replace(":", "");
            strtmp = strtmp.Replace(" ", "-");
            txt = txt + ", " + strtmp + ", " + dName;
            txt = txt + txt2;

            writer.WriteLine(txt);
            writer.Close();

            bResult = true;
        }
        catch (Exception err)
        {
            bResult = false;
        }

        return bResult;
    }

    // テーブルの内容をテキストに書き込む
    public static bool WriteAll(StreamWriter writer, DataTable dt, String Comment)
    {
        bool bResult = true;
        string tmpTxt = "";

        try
        {
            writer.WriteLine(Comment);      // コメントを書き込み

            for (int iLoop = 0; iLoop < dt.Rows.Count; iLoop++)
            {
                tmpTxt = "";

                // 問題の保存形式に変換
                // [記述形式]
                //   問題番号, 正解番号, 問題文, 解答1, 解答2, 解答3, 解答4, ユニークID, 作成者
                tmpTxt = dt.Rows[iLoop]["No"] + ", " + dt.Rows[iLoop]["AnswerNo"];
                tmpTxt = tmpTxt + ", " + dt.Rows[iLoop]["Quiz"];
                tmpTxt = tmpTxt + ", " + dt.Rows[iLoop]["Txt1"];
                tmpTxt = tmpTxt + ", " + dt.Rows[iLoop]["Txt2"];
                tmpTxt = tmpTxt + ", " + dt.Rows[iLoop]["Txt3"];
                tmpTxt = tmpTxt + ", " + dt.Rows[iLoop]["Txt4"];
                tmpTxt = tmpTxt + ", " + dt.Rows[iLoop]["UniqID"];
                tmpTxt = tmpTxt + ", " + dt.Rows[iLoop]["DUser"];
                writer.WriteLine(tmpTxt);      // 1問書き込み
            }
            writer.Close();

            bResult = true;
        }
        catch (Exception err)
        {
            bResult = false;
        }

        return bResult;
    }
}